package _220319;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.StringTokenizer;

/**
 * @author ShadowLim
 * @create 2022-03-19-12:16
 */
public class _打水问题 {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken()), m = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(br.readLine());
        int[] times = new int[n];
        for (int i = 0; i < n; i++) {
            times[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(times); // 贪心策略
        int total = 0;
        for (int i = 1; i <= m; i++) {  // 遍历每个水龙头
            int p = n / m;      // 打水所需的轮数（每m个水龙头作为一轮）
            if (n % m >= i) {
                p++;
            }
            // 从第一个人开始轮询 每次轮询 m 个水龙头 轮询次数就减1
            /**
             *   编号          1              2           3
             *  times         1              2           3
             *                4              5           6
             *                7
             *
             * 等待时间：等待时间为「当前水龙头的前面的人的打水时间」* 「当前轮数 - 1」之和
             * （处于第p轮 则要等待当前水龙头编号的 p - 1 个人）
             *
             * 例如： 打水时间最长的是7（处于第3轮） 其需要等待 1 * 2(2 == p - 1) + 4 * 1
             * (打水时间为4的人是打水时间为7的人即当前要打水的人的前一个人 故只要 * 1)= 6
             */
            for (int idx = i - 1; idx < n; idx += m, p--) {
                total += times[idx] * (p - 1);
            }
        }
        System.out.println(total);
    }
}
